package agenda;

import excecoes.FormaDeContatoInvalida;
import java.io.Serializable;

public abstract class FormaDeContato implements Comparable<FormaDeContato>, Serializable {

	private static final long serialVersionUID = 1L;

	private String tipo, endereco, comentario;

	/**
	 * Cria uma forma de contato.
	 * @param tipo O tipo da forma de contato
	 * @param endereco O endereco da forma de contato (se for um e-mail, um endereco,
	 * se for um telefone, um numero...)
	 * @param comentario Um comentario sobre a forma de contato
	 * @throws FormaDeContatoInvalida Caso o endereco passado seja invalido
	 */

	public FormaDeContato(String tipo, String endereco, String comentario)
			throws FormaDeContatoInvalida {

		this.tipo = tipo;
		validaEndereco(endereco);
		this.endereco = endereco;
		this.comentario = comentario;
	}

	/**
	 * Verifica se um endereco e valido.
	 * @param endereco O endereco a ser verificado.
	 * @throws Exception Lanca excecao caso o endereco seja invalido.
	 */

	public abstract void validaEndereco(String endereco) throws FormaDeContatoInvalida;

	/**
	 * Recupera o tipo da forma de contato.
	 * @return O tipo da forma de contato.
	 */

	public String getTipo() {
		return this.tipo;
	}

	/**
	 * Recupera o endereco da forma de contato.
	 * @return O endereco da forma de contato.
	 */

	public String getEndereco() {
		return endereco;
	}

	/**
	 * Atribui um novo endereco a forma de contato.
	 * @param novoEndereco O novo endereco da forma de contato.
	 * @throws Exception Lanca excecao caso o endereco seja invalido.
	 */

	public void setEndereco(String novoEndereco) throws FormaDeContatoInvalida {
		validaEndereco(novoEndereco);
		this.endereco = novoEndereco;
	}

	/**
	 * Recupera o comentario da forma de contato.
	 * @return O comentario da forma de contato.
	 */

	public String getComentario() {
		return comentario;
	}

	/**
	 * Atribui um novo comentario a forma de contato.
	 * @param comentario O novo comentario da forma de contato.
	 */

	public void setComentario(String comentario) {
		this.comentario = comentario;
	}

	/**
	 * Representa uma forma de contato como String
	 * @return Uma String que representa a forma de contato.
	 */

	@Override
	public String toString() {
		return getTipo() + ": " + getEndereco() + (comentario == null ? "" : " " + comentario);
	}

	/**
	 * Compara duas formas de contato.
	 * @param outra A forma de contato a ser comparada com esta.
	 * @return Zero se as formas de contato possuem tipos iguais, um valor menor que zero se o tipo desta forma
	 * de contato e lexicograficamente menor que o da outra ou um valor menor que zero caso contrario.
	 */

	@Override
	public int compareTo(FormaDeContato outra) {
		return tipo.compareTo(outra.getTipo());
	}
}
